package com.hliushi.redis.controller;

import com.hliushi.redis.config.Constants;
import com.hliushi.redis.controller.vo.Product;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Pageable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author llhuang10
 * @date 2021/8/10 16:17
 */
@Slf4j
@Api("使用双缓存机制")
@RestController
@RequestMapping("/product")
public class ABProductController {


    @Resource
    private RedisTemplate redisTemplate;


    /**
     * 分页查询: 在高并发的情况下, 只能redis查询, 走db的话必定会把db打垮
     *
     * @param
     * @return
     */
    @GetMapping("/findAB")
    public List<Product> find(Pageable pageable) {
        List<Product> list = null;
        long start = (pageable.getPageNumber() - 1) * pageable.getPageSize();
        long end = start + pageable.getPageSize() - 1;

        try {
            // 采用redis list数据结构的lrange命令实现分页查询
            list = redisTemplate.opsForList().range(Constants.JHS_KEY_A, start, end);
            if (CollectionUtils.isEmpty(list)) {
                // 用户先缓存A(上面的代码), 如果缓存A查询不到 (更新缓存的时候删除了), 在查询缓存B
                list = redisTemplate.opsForList().range(Constants.JHS_KEY_B, start, end);
            }
            log.info("查询结果: {}", list);
        } catch (Exception e) {
            // 这里的异常, 一般是redis瘫痪, 或redis网络timeout
            log.error("exception:", e);
            // TODO 走DB查询
        }
        return list;
    }
}
